# 作业：
# 1、整理类的笔记到小红书
# 2、定义一个学生Student类。有下面的类属性：
# 1 姓名 name
# 2 年龄 age
# 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
# 类方法：
# 1 获取学生的姓名：get_name() 返回类型:str
# 2 获取学生的年龄：get_age() 返回类型:int
# 3 返回3门科目中最高的分数。get_course() 返回类型:int
# 4 将每个实例学生对象写进txt文件里，要持久保存
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# 5 获取所有学生的信息
# 写好类以后，可以定义2个同学测试下:
# zm = Student('zhangming',20,[69,88,100])
# 返回结果：
# zhangming
# 20
#
# class Student:
#     def __init__(self, name, age, score):
#         self.name = name
#         self.age = age
#         self.score = score
#
#     def get_name(self):
#         return self.name
#
#     def get_age(self):
#         return self.age
#
#     def get_course(self):
#         return max(self.score)
#
#     def write_to_file(self):
#         with open('students.txt', 'a') as file:
#             student_info = {"姓名": self.name, "年龄": self.age,
#                             "成绩": {"语文": self.score[0], "数学": self.score[1], "英语": self.score[2]}}
#             file.write(str(student_info) + '\n')
#
#     @staticmethod
#     def get_all_students():
#         with open('students.txt', 'r') as file:
#             students = [eval(line.strip()) for line in file]
#         return students
#
#     zm = Student('zhangming', 20, [69, 88, 100])
#     print(zm.get_name())
#     print(zm.get_age())
#     print(zm.get_course())
#
#     zm.write_to_file()
#
#     all_students = zm.get_all_students()
#     for student in all_students:
#         print(student)
# 3、定义一个字典类：dictclass。完成下面的功能：
#
# dict = dictclass({你需要操作的字典对象})
#
# 1 删除某个key
#
# del_dict(key)
#
#
# 2 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
#
# get_dict(key)
#
# 3 返回键组成的类列表：返回型;(list)
#
# get_key()
#
# 4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
#
# update_dict({要合并的字典})
#
# 100
#
# class dictclass:
#     def __init__(self, dictionary):
#         self.dictionary = dictionary
#
#     def del_dict(self, key):
#         if key in self.dictionary:
#             del self.dictionary[key]
#             return "删除成功"
#         else:
#             return "Key不存在"
#
#     def get_dict(self, key):
#         if key in self.dictionary:
#             return self.dictionary[key]
#         else:
#             return "not found"
#
#     def get_key(self):
#         return list(self.dictionary.keys())
#
#     def update_dict(self, new_dict):
#         self.dictionary.update(new_dict)
#         return list(new_dict.values())
#
# d = dictclass({'name': 'Tom', 'age': 18, 'gender': 'Male'})
#
# print(d.del_dict('age'))
# print(d.del_dict('email'))
#
# print(d.get_dict('name'))
# print(d.get_dict('email'))
#
# print(d.get_key())
#
# print(d.update_dict({'email': 'tom@example.com', 'address': '123 Street'}))
# 4、定义一个列表的操作类：Listinfo
#
# 包括的方法:
#
# 1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# 2 列表元素取值：get_key(num) [num:整数类型]
# 3 列表合并：update_list(list) [list:列表类型]
# 4 删除并且返回最后一个元素：del_key()
#
# a = Listinfo([44,222,111,333,454,'sss','333'])
#
# class Listinfo:
#     def __init__(self, lst):
#         self.lst = lst
#
#     def add_key(self, keyname):
#         self.lst.append(keyname)
#
#     def get_key(self, num):
#         if num < len(self.lst):
#             return self.lst[num]
#         else:
#             return "索引超出范围"
#
#     def update_list(self, new_lst):
#         self.lst.extend(new_lst)
#
#     def del_key(self):
#         if len(self.lst) > 0:
#             return self.lst.pop()
#         else:
#             return "列表为空"
# a = Listinfo([44,222,111,333,454,'sss','333'])
#
# print(a.add_key("55"))
# print(a.get_key(7))
# print(a.update_list([666,"888"]))
# print(a.del_key())
# 5、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
#
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！
#
# 以上内容，需要连接数据库，每次的数据都需要增、删、改、查去做
#
# student表：name、age、address、phone_number
#
# 6、点餐管理系统
# 1》、餐馆可以新增菜品、下架菜品、修改菜品
# 2》、每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
# 菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# 3》、餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# 4》、有菜品评分提报功能，对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；
#
class Restaurant:
    def __init__(self):
        self.menu = {}
        self.likes = {}

    def add_dish(self, name, price):
        if name not in self.menu:
            self.menu[name] = price
            self.likes[name] = []
            return "添加成功"
        else:
            return "菜品已存在"

    def remove_dish(self, name):
        if name in self.menu:
            del self.menu[name]
            del self.likes[name]
            return "下架成功"
        else:
            return "菜品不存在"

    def update_dish(self, name, price):
        if name in self.menu:
            self.menu[name] = price
            return "修改成功"
        else:
            return "菜品不存在"

    def like_dish(self, name, score):
        if name in self.menu:
            self.likes[name].append(score)
            return "点赞成功"
        else:
            return "菜品不存在"

    def evaluate_dish(self):
        for dish, scores in self.likes.items():
            average_score = sum(scores) / len(scores)
            if average_score < 3:
                self.remove_dish(dish)

r = Restaurant()

print(r.add_dish('宫保鸡丁', 30))
print(r.add_dish('鱼香肉丝', 25))
print(r.add_dish('辣子鸡', 35))

print(r.update_dish('鱼香肉丝', 28))
print(r.update_dish('回锅肉', 22))

print(r.like_dish('宫保鸡丁', 5))
print(r.like_dish('鱼香肉丝', 4))

r.evaluate_dish()

print(r.menu)
# 7、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性，包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，并调用showInfo方法，输出每个桌子的信息。
#
# class Desk:
#     def __init__(self, length, width, height):
#         self.length = length
#         self.width = width
#         self.height = height
#
#     def showInfo(self):
#         print(f"长度: {self.length}，宽度: {self.width}，高度: {self.height}")
# desk1 = Desk(120, 60, 75)
# desk2 = Desk(160, 80, 70)
#
# desk1.showInfo()
# desk2.showInfo()
# 8、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性。
#
# class User:
#     def __init__(self, username, password):
#         self.username = username
#         self.password = password
# 9、定义一个计算器类，有加减乘除四个方法
#
# class Calculator:
#     @staticmethod
#     def add(num1, num2):
#         return num1 + num2
#
#     @staticmethod
#     def subtract(num1, num2):
#         return num1 - num2
#
#     @staticmethod
#     def multiply(num1, num2):
#         return num1 * num2
#
#     @staticmethod
#     def divide(num1, num2):
#         if num2 != 0:
#             return num1 / num2
#         else:
#             return "除数不能为0"
# print(Calculator.add(3, 5))
# print(Calculator.subtract(10, 7))
# print(Calculator.multiply(4, 6))
# print(Calculator.divide(12, 3))
# print(Calculator.divide(6, 0))
# 10、创建一个名为Person的类，具有以下属性和方法：
#
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
#
# class Person:
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     def greet(self):
#         print(f"你好，我叫{self.name}，今年{self.age}岁。")
# p = Person("张三", 20)
# p.greet()
# 11、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果
#
# class LibrarySystem:
#     def __init__(self, database):
#         self.conn = sqlite3.connect(database)
#         self.create_table()
#
#     def create_table(self):
#         sql = '''
#             CREATE TABLE IF NOT EXISTS book (
#                 id INTEGER PRIMARY KEY AUTOINCREMENT,
#                 title TEXT,
#                 author TEXT,
#                 published_date TEXT
#             );
#         '''
#         self.conn.execute(sql)
#
#     def add_book(self, title, author, published_date):
#         sql = "INSERT INTO book (title, author, published_date) VALUES (?, ?, ?)"
#         self.conn.execute(sql, (title, author, published_date))
#         self.conn.commit()
#         print("添加成功")
#
#     def update_book(self, title, author=None, published_date=None):
#         conditions = []
#         values = []
#
#         if author is not None:
#             conditions.append("author = ?")
#             values.append(author)
#
#         if published_date is not None:
#             conditions.append("published_date = ?")
#             values.append(published_date)
#
#         if len(conditions) > 0:
#             conditions_str = ', '.join(conditions)
#             values.append(title)
#             sql = f"UPDATE book SET {conditions_str} WHERE title = ?"
#             self.conn.execute(sql, tuple(values))
#             self.conn.commit()
#             print("修改成功")
#         else:
#             print("请输入要修改的内容")
#
#     def delete_book(self, title):
#         sql = "DELETE FROM book WHERE title = ?"
#         self.conn.execute(sql, (title,))
#         self.conn.commit()
#         print("删除成功")
#
#     def search_books(self, title=None, author=None, published_date=None):
#         conditions = []
#         values = []
#
#         if title is not None:
#             conditions.append("title = ?")
#             values.append(title)
#
#         if author is not None:
#             conditions.append("author = ?")
#             values.append(author)
#
#         if published_date is not None:
#             conditions.append("published_date = ?")
#             values.append(published_date)
#
#         conditions_str = ' AND '.join(conditions)
#
#         if conditions_str == '':
#             sql = "SELECT * FROM book"
#             cursor = self.conn.execute(sql)
#         else:
#             sql = f"SELECT * FROM book WHERE {conditions_str}"
#             cursor = self.conn.execute(sql, tuple(values))
#
#         books = [row for row in cursor]
#         return books
# l = LibrarySystem('books.db')
#
# l.add_book('Python入门教程', '张三', '2021-08-01')
# l.add_book('Java编程思想', '李四', '2020-05-10')
#
# l.update_book('Python入门教程', author='王五', published_date='2022-01-01')
# l.update_book('C++ Primer', published_date='2023-03-15')
#
# l.delete_book('Java编程思想')
#
# all_books = l.search_books()
# print(all_books)
# 12、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
#
#
# class Car:
#     def __init__(self, brand, color):
#         self.brand = brand
#         self.color = color
#
#     def start_engine(self):
#         print("启动汽车引擎！")
#
#     def stop_engine(self):
#         print("关闭汽车引擎！")
# c = Car("BMW", "黑色")
# c.start_engine()
# c.stop_engine()
# 13、淘宝商家后台，可以上架商品、下架商品，功能如下：
#  （1） 可以添加商品，商家添加完的商品会存到商品列表
#  1.1  商品要有名称、sku、价格
#  （2） 可以修改商品信息：名称、sku、价格
#  （3） 可以对商品进行下架，下架后的商品不再展示
#
# class TaobaoMerchant:
#     def __init__(self):
#         self.products = {}
#
#     def add_product(self, name, sku, price):
#         if name not in self.products:
#             self.products[name] = {'sku': sku, 'price': price}
#             return "商品添加成功"
#         else:
#             return "商品已存在"
#
#     def update_product(self, name, sku=None, price=None):
#         if name in self.products:
#             if sku is not None:
#                 self.products[name]['sku'] = sku
#             if price is not None:
#                 self.products[name]['price'] = price
#             return "商品信息更新成功"
#         else:
#             return "商品不存在"
#
#     def remove_product(self, name):
#         if name in self.products:
#             del self.products[name]
#             return "商品下架成功"
#         else:
#             return "商品不存在"
#
#
# t = TaobaoMerchant()
#
# print(t.add_product("手机", "SKU001", 999))
# print(t.add_product("电脑", "SKU002", 2999))
# print(t.add_product("手机", "SKU003", 1999))
#
# print(t.update_product("手机", sku="SKU004"))
# print(t.update_product("平板电脑", price=1999))
#
# print(t.remove_product("电脑"))
# print(t.remove_product("相机"))
#
# print(t.products)
# 14、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤
#
# class Person:
#     def __init__(self, name, weight):
#         self.name = name
#         self.weight = weight
#
#     def run(self):
#         self.weight -= 0.5
#         print(f"{self.name}跑步后体重减少{self.weight}公斤")
#
#     def eat(self):
#         self.weight += 1
#         print(f"{self.name}吃东西后体重增加{self.weight}公斤")
#
#
# xiaomei = Person("小美", 45.0)
# xiaoming = Person("小明", 75.0)
#
# xiaomei.run()
# xiaoming.run()
#
# xiaomei.eat()
# xiaoming.eat()
# 15、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是班级）
# 抢能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
#
# 要求没子弹，需要输出没有子弹了，且发射失败
# class Soldier:
#     def __init__(self):
#         self.bullet_count = 0
#
#     def fire(self):
#         if self.bullet_count > 0:
#             print("士兵瑞恩开火")
#             self.bullet_count -= 1
#         else:
#             print("没有子弹了，开火失败")
#
#     def add_bullet(self, count):
#         self.bullet_count += count
#         print(f"装填了{count}发子弹，当前剩余子弹数: {self.bullet_count}")
#
#
# s = Soldier()
# s.fire()
#
# s.add_bullet(10)
# s.fire()
#
# s.fire()